from django.shortcuts import render
from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required     #导入登录用户权限操作模块
from learning_logs.models import Topic, Item                  #导入models下的Topic
from .forms import TopicForm, ItemForm					     #导入forms

def index(request):
	'''学习笔记的主页显示'''
	return render(request, 'learning_logs/index.html')     #返回的对象，①请求方式(request)②返回的网页内容，位于learning_logs/templates/learning_logs/index.html

@login_required  
def topics(request):
	#显示所有的主题视图
	topics = Topic.objects.filter(owner=request.user).order_by('date_added')        
	# 进行数据库查询，通过内置方法order_by进行排序,使用filer过滤出用户名属于request.user(failymao)的权限才能读取到。
	context = {'topics':topics}								# 将查询的数据存储在context--以键值对形式存储，即主题--主题内容
	return render(request, 'learning_logs/topics.html', context) #返回显示的内容。

@login_required                                        
def topic(request,topic_id):
	'''显示单个主题及其所有条目'''
	topic = Topic.objects.get(id=topic_id)                 # 获取单个主题内容：用get方法从Topic中获取单个内容
	if topic.owner != request.user:                         # 判断访问的是否是用户配置的权限
		raise Http404                                      # 如果不是抛出异常，页面未被发现。
	items = topic.item_set.order_by('-date_added')		   # 获取单个主题内容的详情：从单个主题中获取item,并以oder_by方法显示最先发布的内容。
	context = {'topic':topic, 'items':items}               # 将内容存储在context字典中，包含单个主题（topic）及其条目明细
	return render (request, 'learning_logs/topic.html',context)

@login_required  
def new_topic(request):
	'''添加新用户主题的函数'''
	if request.method != 'POST':
		form = TopicForm()
	else:
		#请求方式为 POST，提交数据，对数据进行处理
		form = TopicForm(request.POST)
		if form.is_valid():                #如果form有效--即在网页中如果输入的内容不为空，则对表单进行保存
			new_topic = form.save(commit=False)
			new_topic.owner = request.user   # 将当前新建的主题用户权限绑定到request.user(数据库中已经设置好)
			new_topic.save()           
				# 通过Http方法对和reverse,直接反向查找得到对应url中name为topics的网址。
			return HttpResponseRedirect(reverse('learning_logs:topics'))
	#将表单内容以字典的形式存储进数据库中		
	context = {'form': form}
	#返回页面请求
	return render(request, 'learning_logs/new_topic.html', context)

@login_required  
def new_item(request, topic_id):                           #顶一个函数可以由用户添加新的内容，函数两个参数
	'''在特定主题下添加新的内容'''
	topic = Topic.objects.get(id=topic_id)                 # 通过get方法获取单个数据

	if request.method != 'POST':                           # 判断request请求方法，不为POST时
		form =ItemForm()                                   # 创建一个空的form
	else:                                                  # request请求方法为Post的时候
		form = ItemForm(request.POST)                      # 获取数据
		if form.is_valid():                                # 判断forms是否有效，如果有效
			new_item = form.save(commit=False)             # 创建的新的条目对象被保存进form,通过commit来控制数据是否保存进数据库
			new_item.topic = topic                         # 
			new_item.save()								   # 将新的条目保存
			return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic_id]))  #通过reverse获取反向的url
	context = {'topic':topic, 'form':form }                # 获得上下文的内容包含form 新建框，和主题信息
	return render(request, 'learning_logs/new_item.html', context)  # 在网页显示相关内容。

@login_required  
def edit_item(request, item_id):
	'''定义函数用来编译现有的item'''
	item = Item.objects.get(id=item_id)                 # 因为编辑需要选定已有的条目：通过字典的方式获取单个数据--
	topic = item.topic                                  # 通过item的属性获取当前条目下的主题
	if topic.owner != request.user:                      # 判断访问的是否是用户配置的权限
		raise Http404                                   #用来保护edit_item权限，非配置的用户无法创建新的主题。
	if request.method != 'POST':                        # 判断服务器请求方式，如果为GET
		form = ItemForm(instance=item)                  # 利用instance方法获取原数据
	else:                                               # 如果请求的方式为POST,将传过来的数据保存在表格中
		form = ItemForm(instance=item, data=request.POST)
		if form.is_valid():                             # 对判断表格的有效性
			form.save()									# 有效的话，保存表格
			return HttpResponseRedirect(reverse('learning_logs:topic', args=[topic.id])) # 返回url
	context = {'item': item, 'topic':topic, 'form': form}   # 获得上下内容
	return render(request, 'learning_logs/edit_item.html', context) # 返回内容
